from datetime import datetime
import pymysql
from werkzeug.security import generate_password_hash  # 根据字符串参数进行加密
from werkzeug.security import check_password_hash  # 参数1：加密后数据，参数2：被加密字符串
from app.ext import db
from app.common.constants import ResultCode
from app.ext import r
from app import user_app
pymysql.install_as_MySQLdb()


class User(db.Model):
    """
    数据表类,该类需要继承 db.Model
    """
    __tablename__ = "username"  # 设计表的名字
    # 设计表的字段以及类型 ,数据表必须的设置一个主键列
    id = db.Column(db.Integer, primary_key=True, index=True, comment="索引id")  # index = True ,为这列创建索引,提升查询效率
    user_id = db.Column(db.String(20), comment="用户id", unique=True)  # unique 该列字段不允许重复
    username = db.Column(db.String(20), comment="账户名")
    password = db.Column(db.String(300), comment="密码")
    age = db.Column(db.Integer, nullable=True, comment="年龄")
    height = db.Column(db.Integer, nullable=True, comment="身高")  # nullable设为 True ,这列允许使用空值
    width = db.Column(db.Integer, nullable=True, comment="体重")
    update_time = db.Column(db.DateTime, nullable=True, default=datetime.now)


with user_app.app_context():  # 数据表的创建
        db.create_all()


class UserModel(User):
    """ 增删改查 函数操作"""

    def insert(self, data):
        """ 每次调用该函数进行数据插入，需要创建新的实例对象 """
        friend = User.query.filter_by(user_id=data['user_id']).first()
        if friend:
            return False  # 用户已存在
        for key, values in data.items():
            if values is None or str(key) == "id":
                continue
            setattr(self, key, data[key])  # 将key - value 的值 融合赋值给属性
        self.password = generate_password_hash(self.password)  # 对存储的进行加密
        db.session.add(self)  # 将类的属性值提交至数据库会话中
        db.session.flush()
        db.session.commit()  # 提交会话执行
        return True  # 数据插入成功

    def delete(self, data):
        """ 根据 user_id 删除 """
        friend = User.query.filter_by(user_id=data['user_id']).first()  # 获取数据表id 的数据行对象 注：User = 类名
        if friend:
            db.session.delete(friend)  # 根据数据行对象进行提交删除
            db.session.commit()
            r.delete(data['user_id'])  # 将redis的id删除
            return True
        else:
            return False

    def update(self, data):
        """ 数据修改 """
        friend = User.query.filter_by(user_id=data['user_id']).first()  # 获取数据表id 的数据行对象 注：User = 类名
        if friend:
            for key, values in data.items():
                if values is None or key == "update_time":
                    continue
                setattr(friend, key, data[key])  # 将key - value 的值 融合赋值给属性
            friend.password = generate_password_hash(friend.password)  # 对存储的进行加密
            db.session.commit()  # 更改了数据行对象的值，直接提交执行，即可更改数据表
            r.delete(data['user_id'])  # 将redis的id删除
            return True
        else:
            return False

    def user_info(self, user_id):
        friend = User.query.filter_by(user_id=user_id['user_id']).first()  # 获取数据表id 的数据行对象 注：User = 类名
        if friend:
            content = {
                "id": friend.id, "user_id": user_id['user_id'], "username": friend.username,
                "password": friend.password, "age": friend.age, "height": friend.height,
                "width": friend.width, 'update_time': str(friend.update_time)
            }
            return content
        else:
            return None


